home *** CD-ROM | disk | FTP | other *** search
- 10 REM This program will generate a maze on the screen of an IBM
- 20 REM compatible PC. A different random number seed will produce a
- 30 REM different maze.
- 40 REM
- 50 REM Written by James L. Dean
- 60 REM 406 40th Street
- 70 REM New Orleans, LA 70124
- 80 REM December 22, 1985
- 90 REM
- 100 KEY OFF
- 110 CLS
- 120 RANDOMIZE TIMER
- 130 NUM.COLUMNS%=79
- 140 NUM.ROWS%=49
- 150 REM DIM PATH%(NUM.COLUMNS%,NUM.ROWS%)
- 160 DIM PATH%(79,49)
- 170 DIM DELTA%(21,2)
- 180 DIM MAGNITUDE%(2)
- 190 MAGNITUDE%(1)=(319\NUM.COLUMNS%)\2
- 200 MAGNITUDE%(2)=(199\NUM.ROWS%)\2
- 210 X.MAX%=2*MAGNITUDE%(1)*NUM.COLUMNS%
- 220 Y.MAX%=2*MAGNITUDE%(2)*NUM.ROWS%
- 230 FOR DELTA.INDEX.1%=1 TO 10
- 240 DELTA%(DELTA.INDEX.1%,1)=1
- 250 DELTA%(DELTA.INDEX.1%,2)=0
- 260 NEXT DELTA.INDEX.1%
- 270 FOR DELTA.INDEX.1%=11 TO 17
- 280 DELTA%(DELTA.INDEX.1%,1)=0
- 290 DELTA%(DELTA.INDEX.1%,2)=1
- 300 NEXT DELTA.INDEX.1%
- 310 FOR DELTA.INDEX.1%=18 TO 19
- 320 DELTA%(DELTA.INDEX.1%,1)=-1
- 330 DELTA%(DELTA.INDEX.1%,2)=0
- 340 NEXT DELTA.INDEX.1%
- 350 FOR DELTA.INDEX.1%=20 TO 21
- 360 DELTA%(DELTA.INDEX.1%,1)=0
- 370 DELTA%(DELTA.INDEX.1%,2)=-1
- 380 NEXT DELTA.INDEX.1%
- 390 DIM COORD%(2),NEW.COORD%(2)
- 400 SCREEN 1
- 405 COLOR 0,4
- 410 CLS
- 420 X%=0
- 430 WHILE (X% <= X.MAX%)
- 440 LINE (X%,0)-(X%,Y.MAX%),3
- 450 X%=X%+2*MAGNITUDE%(1)
- 460 WEND
- 470 Y%=0
- 480 WHILE (Y% <= Y.MAX%)
- 490 LINE (0,Y%)-(X.MAX%,Y%),3
- 500 Y%=Y%+2*MAGNITUDE%(2)
- 510 WEND
- 520 FOR COLUMN%=1 TO NUM.COLUMNS%
- 530 FOR ROW%=1 TO NUM.ROWS%
- 540 PATH%(COLUMN%,ROW%)=0
- 550 NEXT ROW%
- 560 NEXT COLUMN%
- 570 COORD%(1)=1
- 580 COORD%(2)=1
- 590 NUM.PATHS%=1
- 600 PATH%(1,1)=NUM.PATHS%
- 610 GOTO 830
- 620 DEAD.END%=0
- 630 FOR DELTA.INDEX.1%=1 TO 21
- 640 DELTA.INDEX.2%=1+INT(21!*RND)
- 650 FOR DIM.NUM%=1 TO 2
- 660 TEM.INT%=DELTA%(DELTA.INDEX.1%,DIM.NUM%)
- 670 DELTA%(DELTA.INDEX.1%,DIM.NUM%)=DELTA%(DELTA.INDEX.2%,DIM.NUM%)
- 680 DELTA%(DELTA.INDEX.2%,DIM.NUM%)=TEM.INT%
- 690 NEXT DIM.NUM%
- 700 NEXT DELTA.INDEX.1%
- 710 FOR DELTA.INDEX.1%=1 TO 21
- 720 FOR DIM.NUM%=1 TO 2
- 730 NEW.COORD%(DIM.NUM%)=COORD%(DIM.NUM%)+DELTA%(DELTA.INDEX.1%,DIM.NUM%)
- 740 NEXT DIM.NUM%
- 750 IF NEW.COORD%(1) < 1 THEN 800
- 760 IF NEW.COORD%(1) > NUM.COLUMNS% THEN 800
- 770 IF NEW.COORD%(2) < 1 THEN 800
- 780 IF NEW.COORD%(2) > NUM.ROWS% THEN 800
- 790 IF PATH%(NEW.COORD%(1),NEW.COORD%(2)) = 0 THEN 820
- 800 NEXT DELTA.INDEX.1%
- 810 DEAD.END%=1
- 820 RETURN
- 830 GOSUB 620
- 840 IF DEAD.END% <> 0 THEN 410
- 850 GOSUB 1770
- 860 PATH%(COORD%(1),COORD%(2))=NUM.PATHS%
- 870 IF COORD%(1) <> NUM.COLUMNS% THEN 830
- 880 IF COORD%(2) <> NUM.ROWS% THEN 830
- 890 FOR DELTA.INDEX.1%=1 TO 10
- 900 DELTA%(DELTA.INDEX.1%,1)=-1
- 910 DELTA%(DELTA.INDEX.1%,2)=0
- 920 NEXT DELTA.INDEX.1%
- 930 FOR DELTA.INDEX.1%=11 TO 17
- 940 DELTA%(DELTA.INDEX.1%,1)=0
- 950 DELTA%(DELTA.INDEX.1%,2)=-1
- 960 NEXT DELTA.INDEX.1%
- 970 FOR DELTA.INDEX.1%=18 TO 19
- 980 DELTA%(DELTA.INDEX.1%,1)=1
- 990 DELTA%(DELTA.INDEX.1%,2)=0
- 1000 NEXT DELTA.INDEX.1%
- 1010 FOR DELTA.INDEX.1%=20 TO 21
- 1020 DELTA%(DELTA.INDEX.1%,1)=0
- 1030 DELTA%(DELTA.INDEX.1%,2)=1
- 1040 NEXT DELTA.INDEX.1%
- 1050 FOR COLUMN%=NUM.COLUMNS% TO 1 STEP -1
- 1060 STARTING.ROW%=1
- 1070 WHILE (STARTING.ROW% <= NUM.ROWS%)
- 1080 IF PATH%(COLUMN%,STARTING.ROW%) = 1 THEN 1110
- 1090 STARTING.ROW%=STARTING.ROW%+1
- 1100 WEND
- 1110 ROW%=STARTING.ROW%
- 1120 WHILE (ROW% < NUM.ROWS%)
- 1130 ROW%=ROW%+1
- 1140 IF PATH%(COLUMN%,ROW%) = 0 THEN GOSUB 1460
- 1150 WEND
- 1160 NEXT COLUMN%
- 1170 FOR DELTA.INDEX.1%=1 TO 10
- 1180 DELTA%(DELTA.INDEX.1%,1)=1
- 1190 DELTA%(DELTA.INDEX.1%,2)=0
- 1200 NEXT DELTA.INDEX.1%
- 1210 FOR DELTA.INDEX.1%=11 TO 17
- 1220 DELTA%(DELTA.INDEX.1%,1)=0
- 1230 DELTA%(DELTA.INDEX.1%,2)=1
- 1240 NEXT DELTA.INDEX.1%
- 1250 FOR DELTA.INDEX.1%=18 TO 19
- 1260 DELTA%(DELTA.INDEX.1%,1)=-1
- 1270 DELTA%(DELTA.INDEX.1%,2)=0
- 1280 NEXT DELTA.INDEX.1%
- 1290 FOR DELTA.INDEX.1%=20 TO 21
- 1300 DELTA%(DELTA.INDEX.1%,1)=0
- 1310 DELTA%(DELTA.INDEX.1%,2)=-1
- 1320 NEXT DELTA.INDEX.1%
- 1330 FOR COLUMN%=1 TO NUM.COLUMNS%
- 1340 STARTING.ROW%=1
- 1350 WHILE (STARTING.ROW% <= NUM.ROWS%)
- 1360 IF PATH%(COLUMN%,STARTING.ROW%) = 1 THEN 1390
- 1370 STARTING.ROW%=STARTING.ROW%+1
- 1380 WEND
- 1390 ROW%=STARTING.ROW%
- 1400 WHILE (ROW% > 1)
- 1410 ROW%=ROW%-1
- 1420 IF PATH%(COLUMN%,ROW%) = 0 THEN GOSUB 1460
- 1430 WEND
- 1440 NEXT COLUMN%
- 1450 GOTO 1880
- 1460 COORD%(1)=COLUMN%
- 1470 COORD%(2)=ROW%
- 1480 NUM.PATHS%=NUM.PATHS%+1
- 1490 PATH%(COORD%(1),COORD%(2))=NUM.PATHS%
- 1500 GOSUB 620
- 1510 IF DEAD.END% <> 0 THEN 1540
- 1520 GOSUB 1770
- 1530 GOTO 1490
- 1540 FOR DELTA.INDEX.1%=1 TO 21
- 1550 FOR DIM.NUM%=1 TO 2
- 1560 NEW.COORD%(DIM.NUM%)=COORD%(DIM.NUM%)+DELTA%(DELTA.INDEX.1%,DIM.NUM%)
- 1570 NEXT DIM.NUM%
- 1580 IF NEW.COORD%(1) < 1 THEN 1630
- 1590 IF NEW.COORD%(1) > NUM.COLUMNS% THEN 1630
- 1600 IF NEW.COORD%(2) < 1 THEN 1630
- 1610 IF NEW.COORD%(2) > NUM.ROWS% THEN 1630
- 1620 IF PATH%(NEW.COORD%(1),NEW.COORD%(2)) = 1 THEN 1750
- 1630 NEXT DELTA.INDEX.1%
- 1640 FOR DELTA.INDEX.1%=1 TO 21
- 1650 FOR DIM.NUM%=1 TO 2
- 1660 NEW.COORD%(DIM.NUM%)=COORD%(DIM.NUM%)+DELTA%(DELTA.INDEX.1%,DIM.NUM%)
- 1670 NEXT DIM.NUM%
- 1680 IF NEW.COORD%(1) < 1 THEN 1730
- 1690 IF NEW.COORD%(1) > NUM.COLUMNS% THEN 1730
- 1700 IF NEW.COORD%(2) < 1 THEN 1730
- 1710 IF NEW.COORD%(2) > NUM.ROWS% THEN 1730
- 1720 IF PATH%(NEW.COORD%(1),NEW.COORD%(2)) <> NUM.PATHS% THEN 1750
- 1730 NEXT DELTA.INDEX.1%
- 1740 GOTO 1760
- 1750 GOSUB 1770
- 1760 RETURN
- 1770 IF COORD%(1) = NEW.COORD%(1) THEN 1830
- 1780 X%=(COORD%(1)+NEW.COORD%(1)-1)*MAGNITUDE%(1)
- 1790 Y%=(2*COORD%(2)-1)*MAGNITUDE%(2)
- 1800 LINE (X%,Y%-MAGNITUDE%(2)+1)-(X%,Y%+MAGNITUDE%(2)-1),0
- 1810 COORD%(1)=NEW.COORD%(1)
- 1820 GOTO 1870
- 1830 X%=(2*COORD%(1)-1)*MAGNITUDE%(1)
- 1840 Y%=(COORD%(2)+NEW.COORD%(2)-1)*MAGNITUDE%(2)
- 1850 LINE (X%-MAGNITUDE%(1)+1,Y%)-(X%+MAGNITUDE%(1)-1,Y%),0
- 1860 COORD%(2)=NEW.COORD%(2)
- 1870 RETURN
- 1880 PAINT (MAGNITUDE%(1),MAGNITUDE%(2)),2,3
- 1890 X.LOW%=MAGNITUDE%(1)
- 1900 X.HIGH%=X.MAX%-X.LOW%
- 1910 X.STEP%=2*X.LOW%
- 1920 Y.LOW%=MAGNITUDE%(2)
- 1930 Y.HIGH%=Y.MAX%-Y.LOW%
- 1940 Y.STEP%=2*Y.LOW%
- 1950 FOR X%=X.LOW% TO X.HIGH% STEP X.STEP%
- 1960 Y%=Y.LOW%
- 1970 WHILE (POINT(X%,Y%) = 0)
- 1980 Y%=Y%+Y.STEP%
- 1990 WEND
- 2000 WHILE (Y% > Y.LOW%)
- 2010 Y%=Y%-Y.STEP%
- 2020 IF POINT(X%,Y%) <> 0 THEN 2060
- 2030 PAINT (X%,Y%),2,3
- 2040 Y.OUT%=Y%+MAGNITUDE%(2)
- 2050 LINE (X%-MAGNITUDE%(1)+1,Y.OUT%)-(X%+MAGNITUDE%(1)-1,Y.OUT%),2
- 2060 WEND
- 2070 NEXT X%
- 2080 FOR X%=X.HIGH% TO X.LOW% STEP -X.STEP%
- 2090 Y%=Y.LOW%
- 2100 WHILE (POINT(X%,Y%) = 0)
- 2110 Y%=Y%+Y.STEP%
- 2120 WEND
- 2130 WHILE (Y% < Y.HIGH%)
- 2140 Y%=Y%+Y.STEP%
- 2150 IF POINT(X%,Y%) <> 0 THEN 2190
- 2160 PAINT (X%,Y%),2,3
- 2170 Y.OUT%=Y%-MAGNITUDE%(2)
- 2180 LINE (X%-MAGNITUDE%(1)+1,Y.OUT%)-(X%+MAGNITUDE%(1)-1,Y.OUT%),2
- 2190 WEND
- 2200 NEXT X%
- 2210 PAINT (MAGNITUDE%(1),MAGNITUDE%(2)),0,3
- 2220 LINE (1,Y.MAX%)-(2*MAGNITUDE%(1)-1,Y.MAX%),0
- 2230 LINE (X.MAX%-2*MAGNITUDE%(1)+1,0)-(X.MAX%-1,0),0
- 2240 SOUND 400,18
- 2250 I$=INKEY$
- 2260 IF LEN(I$) = 0 THEN 2250
- 2270 SCREEN 0
- 2280 WIDTH 80
- 2290 END